home *** CD-ROM | disk | FTP | other *** search
/ Aminet 15 / Aminet 15 - Nov 1996.iso / Aminet / dev / e / ProgSuite.lha / ProgSuite / World.e < prev   
Text File  |  1996-09-09  |  4KB  |  133 lines

  1. /* World - ProgSuite V1.0 World program */
  2.  
  3. MODULE 'intuition/intuition', 'intuition/screens', 'graphics/view'
  4. MODULE 'amigalib/ports', 'dos/dos'
  5. MODULE 'exec/memory', 'exec/nodes', 'exec/ports'
  6.  
  7. MODULE '*Defs'
  8.  
  9. /* Screen size */
  10. CONST SIZEX = 640, SIZEY = 480
  11.  
  12. /* Variable to hold our own name (should be a constant...) */
  13. DEF progname: PTR TO CHAR
  14.  
  15. /* Communications variables */
  16. DEF worldport = NIL: PTR TO mp,
  17.     wakemsg = NIL: PTR TO portMessage, finishmsg = NIL: PTR TO portMessage,
  18.     recvmsg: PTR TO portMessage
  19.  
  20. /* Screen and window pointers */
  21. DEF progsuitescreen: PTR TO screen, viewwin: PTR TO window
  22.  
  23. /* The main procedure */
  24.  
  25. PROC main () HANDLE
  26.   progname := 'World'
  27.   progsuitescreen := NIL ; viewwin := NIL
  28.   worldport := portCreate ('WorldPort', progname)
  29.   wakemsg := messageCreate (worldport, progname)
  30.   wakemsg.msn := WAKEMSG  -> Our WakeUp message
  31.   finishmsg := messageCreate (worldport, progname)
  32.   finishmsg.msn := FINISHMSG  -> Our Finish message
  33.  
  34.   -> Open the out-the-cabin view window
  35.   initView ()
  36.  
  37.   -> World will wait for a QUIT message and reply it,
  38.   -> and then exit
  39.  
  40.   -> Report our readyness to the master
  41.   WriteF ('\s: Sending WakeUp message (\d) to Master...\n', progname, wakemsg.msn)
  42.   IF FALSE = messageSend (wakemsg, 'MasterPort') THEN Raise (ERR_FINDPORT)
  43.  
  44.   -> Wait for messages, and take appropriate actions
  45.   worldLoop ()
  46.  
  47.   -> Finish off
  48.   finishView ()
  49.  
  50.   Raise (ERR_NONE)
  51. EXCEPT DO
  52.   IF worldport THEN portRemove (worldport)
  53.   IF wakemsg THEN Dispose (wakemsg)
  54.   IF finishmsg THEN Dispose (finishmsg)
  55.   IF (viewwin) THEN finishView ()
  56.   SELECT exception
  57.   CASE ERR_FINDSCREEN
  58.     WriteF ('\s: Can''t find ProgSuite Screen: This program should be started from Master!\n', progname)
  59.   CASE "WIN"
  60.     UnlockPubScreen (NIL, progsuitescreen)
  61.     WriteF ('\s: Can''t open window!\n', progname)
  62.   CASE "PORT"
  63.     WriteF ('\s: Can''t create messageport "WorldPort"!\n', progname)
  64.   CASE ERR_FINDPORT
  65.     WriteF ('\s: Can''t find messageport "MasterPort"!\n', progname)
  66.   CASE "MEM"
  67.     WriteF ('\s: Can''t get memory!\n', progname)
  68.   ENDSELECT
  69. ENDPROC
  70.  
  71. /* procedure to display the outside world view */
  72.  
  73. PROC initView ()
  74. DEF width = 480, height = 200
  75.  
  76.   -> Open our window on the common screen (horizontally centered, and as high as possible)
  77.   progsuitescreen := LockPubScreen ('ProgSuiteScreen')
  78.   viewwin := OpenW ((SIZEX - width) / 2, 0, width, height,
  79. ->                    IDCMP_MOUSEBUTTONS OR IDCMP_CLOSEWINDOW OR IDCMP_INTUITICKS,
  80.                     IDCMP_MOUSEBUTTONS OR IDCMP_CLOSEWINDOW,
  81.                     WFLG_CLOSEGADGET OR WFLG_BORDERLESS, 
  82.                     'World window - Hit close box to finish demo', NIL, NIL, NIL,
  83.                     [WA_PUBSCREEN, progsuitescreen, 0])
  84.   UnlockPubScreen (NIL, progsuitescreen)
  85.  
  86. ENDPROC
  87.  
  88. /* Procedure to close the view window */
  89.  
  90. PROC finishView ()
  91.   CloseW (viewwin) ; viewwin := NIL
  92. ENDPROC
  93.  
  94. /* The main message loop */
  95.  
  96. PROC worldLoop ()
  97. DEF portsig, winsig, signal, finish = FALSE
  98.   portsig := Shl (1, worldport.sigbit)
  99.   winsig := Shl (1, viewwin.userport.sigbit)
  100.   REPEAT
  101.     signal := Wait (portsig OR winsig)
  102.     IF signal AND winsig THEN handleWindowMessages ()
  103.     IF signal AND portsig THEN finish := handlePortMessages ()
  104.   UNTIL finish
  105. ENDPROC
  106.  
  107. /* Procedure to handle incoming Exec messages */
  108.  
  109. PROC handlePortMessages ()
  110. DEF finish = FALSE
  111.   WHILE recvmsg := GetMsg (worldport)
  112.     messageCheckOwn (recvmsg, worldport, progname)
  113.     IF recvmsg.msn = QUITWORLDMSG THEN finish := TRUE
  114.     messageReply (recvmsg, worldport)
  115.   ENDWHILE
  116. ENDPROC finish
  117.  
  118. /* Procedure to handle Intuition messages */
  119.  
  120. PROC handleWindowMessages ()
  121. DEF recvimsg: PTR TO intuimessage, class, code
  122.   WHILE recvimsg := GetMsg (viewwin.userport)
  123.     class := recvimsg.class ; code := recvimsg.code
  124.     WriteF ('\s: IDCMP received: \d \d\n', progname, class, code)
  125.     SELECT class
  126.       CASE IDCMP_CLOSEWINDOW
  127.         WriteF ('\s: Sending Finish message (\d) to Master...\n', progname, finishmsg.msn)
  128.         messageSend (finishmsg, 'MasterPort')
  129.     ENDSELECT
  130.     messageReply (recvimsg, worldport)
  131.   ENDWHILE
  132. ENDPROC
  133.